package com.qf.filters;

import com.qf.feign.CacheService;
import com.qf.service.SendReportService;
import com.qianfeng.smsplatform.common.constants.CacheConstants;
import com.qianfeng.smsplatform.common.constants.InterfaceExceptionDict;
import com.qianfeng.smsplatform.common.model.Standard_Report;
import com.qianfeng.smsplatform.common.model.Standard_Submit;
import org.bouncycastle.util.Times;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.util.Map;
import java.util.Set;

/*
 * @Data: 2021/7/20 8:35
 * */

/*
* 这个过滤器的主要作用是限流的
 * 限制同一个客户针对同一个号码最多能发送多少次短信
 * 比如一分钟最多发2次, 一小时5次 一天 10次
* */
@Component
public class LimitFilterByredis implements FiltersChain {


    private SendReportService sendReportService;
    @Autowired
    public void setSendReportService(SendReportService sendReportService) {
        this.sendReportService = sendReportService;
    }

    private CacheService cacheService;
    @Autowired
    public void setCacheService(CacheService cacheService) {
        this.cacheService = cacheService;
    }

    public boolean dealSms(Standard_Submit standard_submit){

        Boolean result=true;
//        获取当前客户针对这个号码已经发送了多少次短信 比如放到redis  如果放到redis 在进行比较
        int clientID = standard_submit.getClientID();
//        给这个手机发消息     发送的手机号
        String destMobile = standard_submit.getDestMobile();
//      当前时间

//        先获取限流策略   查询到所有的限流策略
        Set<Map> allLimits = cacheService.getDataFromZsetByIndex(CacheConstants.CACHE_LIMITSTRATEGY_KEY, 0, -1);
//        按照时间 * 1000  得到毫秒值   以当前时间为基准 向前推指定的时间数
        long max = System.currentTimeMillis();
//      拿到每一个策略 进行判断
        for(Map allLimit: allLimits){
            Integer count = (Integer) allLimit.get("value"); //限制的次数
            Double times = (Double)allLimit.get("score");// 限制的时间
//
            long min= (long) (max-times*1000); //起始的时间
//          获取这个时间范围的 已经发送的次数
            Long currentCount = cacheService.getSizeByScore(CacheConstants.CACHE_PREFIX_SMS_LIMIT+clientID+destMobile, min, max);
//          和限制的次数进行比较
            if(currentCount>=count){
                System.out.println("超出限制了");
//                超出了限制  跳出整个循环
                result=false;
                break;
            }
        }
        if(!result){
            //被拦截了
            //发送短信太频繁了
        /*    Standard_Report standard_report = new Standard_Report();
            standard_report.setClientID(standard_submit.getClientID());
            standard_report.setSrcID(standard_submit.getSrcSequenceId());
            standard_report.setState(2);
            standard_report.setErrorCode(InterfaceExceptionDict.RETURN_STATUS_LIMIT_ERROR);
            standard_report.setDescription("当前手机号发送短信太过频繁");
            standard_report.setMobile(standard_submit.getDestMobile());
            standard_report.setSendCount(1);//第几次推送, 是这样的,我们告诉客户结果,中间可能因为网络等原因没推送到,我们需要重试,但是呢又不是无限制重试,我们可以设置一个阈值
            sendReportService.sendSmsReport(standard_report);*/

            standard_submit.setReportState(2);
            standard_submit.setErrorCode(InterfaceExceptionDict.RETURN_STATUS_LIMIT_ERROR);
            standard_submit.setDescription("当前手机号"+standard_submit.getDestMobile()+"发送消息太过频繁");
        }else {
            System.out.println("没有超出限制");
            cacheService.add2Zent(CacheConstants.CACHE_PREFIX_SMS_LIMIT + clientID + destMobile,max+"",max);

        }
        return result;
    }
}
